package com.cctc.juc.source.Athread.threadlocal.CInheritableThreadLocal;

/**
 * InheritableThreadLocal [ITL 可继承的线程本地变量]
 * 描述信息：ITL 是 TL 派生出来专门解决线程本地变量父传子问题的。当一个线程派生出一个子线程时，子线程可以继承父线程中的值，这在某些情况下特别有用，比如在进行请求处理或任务分派时。
 * 缺点：
 * 1. 线程不安全。当一个线程派生出一个子线程时，子线程可以继承父线程中的值。子线程继承过来的 ThreadLocalMap 变量与父线程的 ThreadLocalMap 指向的是同一个对象，如果该 ThreadLocalMap 是只读的，没有问题，但是如果是可写的，那么任意子线程针对该 ThreadLocalMap 的修改都会影响到父线程的 ThreadLocalMap，从而引发线程安全问题。
 * 2. 无法应用于线程池中的 【复用】 线程。对于线程池等池化 【复用】 线程执行组件来说，ITL 将会失效，因为 ThreadLocalMap 是通过在初始化子线程的时候进行向下传递的，而线程池在执行异步任务时可能不再需要创建新的线程了，因此也就不会再调用初始化方法传递父线程的 ThreadLocalMap 给子线程了。
 * 解决方案：TransmittableThreadLocal  [TTL 可传播的线程本地变量（ITL 的优化版）] 解决了这个问题，它可以在多线程环境下正确地传递数据。当一个线程从线程池中获取到一个线程时，TTL 会自动将当前线程的 ThreadLocal 副本传递给新的线程，从而保证数据的正确性。
 */
public class TInheritableThreadLocal<T> extends ThreadLocal<T> {
    public TInheritableThreadLocal() {
    }

    @Override
    ThreadLocalMap getMap(Thread t) {
        return t.interitableThreadLocals;
    }

}
